java - 文件 IO 与 android.os.memoryfile

标签 java android

我正在尝试使用 android.os.memoryfile 写入一个文件,然后从同一个文件中读取。我用一种方法写入文件并从另一种方法读取,都在同一个类中。我可以写得很好,但是当我读取文件时,我得到的是符号行,而不是我写入文件的内容。读取方法似乎没有读取我写入的文件。

如果我用相同的方法编写和读取文件的代码,它似乎工作正常。读取文件输出我写的字符串。

这是我的代码:

    public class FileActivity extends Activity {

        MemoryFile memFile;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            memFile = new MemoryFile("MemoryFileTest", 1000000);
        } catch (IOException e) {
            e.printStackTrace();
        }
     }



      public void readFile () {
            StringBuffer strBuffer = new StringBuffer();

            try {

            InputStream in = memFile.getInputStream();
            BufferedReader reader = new BufferedReader(new  InputStreamReader(in));

           String inputString;
           while ((inputString = reader.readLine()) != null) {
                strBuffer.append(inputString + "\n");
           }

           in.close();
           reader.close();

             Log.d(TAG, strBuffer.toString());
          } catch (IOException e) {
              e.printStackTrace();
          }
    } 

    public void writeFile () {
         String example = "This is an example";
         byte[] bytes = example.getBytes();
         try {
              OutputStream out = memFile.getOutputStream();
              out.write(bytes);

              out.close();
         }  catch (IOException e) {
            e.printStackTrace();
         }
     }
}

在上面的代码中,MemoryFile 在类的顶部声明,并在 onCreate() 方法中初始化。然后我尝试用那个 MemoryFile 进行读写。

我在这里错过了什么?

最佳答案

我没用过MemoryFile并且只是针对这个问题开始学习它。我查看了 Android Studio 中的源代码。我在网上找不到原始来源。 grepcode 版本为 here .从我的实验和查看源代码可以看出,我们期望从基于文件的流中获得的文件结尾概念显然不适用于 MemoryFile。文件结尾基于 MemoryFile 构造函数中指定的长度,而不是已写入文件的字节数。鉴于此,您在代码中使用的 BufferedReader.readline() 的行为没有明确定义,因为它期望在字符末尾找到文件结束条件stream 并且在到达分配的内存缓冲区的末尾之前,它不会使用 MemoryFile 获取它。这解释了为什么您会在 logcat 输出中看到所有菱形问号。

为了更好地理解文件结束行为,您可以像这样修改 readFile()。您会看到“n”是您在 MemoryFile 构造函数中指定的长度。

public void readFile () {
    StringBuffer strBuffer = new StringBuffer();

    try {
        InputStream in = memFile.getInputStream();

        int b;
        int n = 0;
        while ((b = in.read()) != -1) {
            n++;
        }
        Log.d(TAG, String.format("Stream contains %d bytes", n));

        /***************
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));

        String inputString;
        while ((inputString = reader.readLine()) != null) {
            strBuffer.append(inputString + "\n");
        }
        in.close();
        reader.close();

        Log.i(TAG, strBuffer.toString());
        *******************/
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我无法解释为什么当读取和写入在同一方法中时您会看到输出,而当它们在不同的方法中时却看不到。单独的方法对我有用(三星 S3 上的 KitKat)。既然已经了解 BufferReader 不能用于 MemoryFile,那么为什么它以一种方式而不是另一种方式工作的问题并不重要。

您可能会发现这些 MemoryFile test cases作为其使用示例很有帮助。我没有找到任何其他好的例子。

关于java - 文件 IO 与 android.os.memoryfile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31372816/

相关文章:

android - Android Studio无法无故完成Gradle执行

java - 当对三个整数使用两次 = 运算符时,会发生什么?

java - 使用 SSL 和自签名证书让 JMX 在 Tomcat 7 下工作

android - 理解 updateWithOnConflict

android - Boot BroadcastReceiver 在小米设备上不起作用

java - 纯java adb客户端

java - Hadoop:使用什么来代替已弃用的接口(interface) Mapper 和Reducer?

java - 如何从不同的(子)目录中提取 java 源文件?

java - 在非托管 CDI Bean 中引用 CDI Bean

android - 需要按顺序发送多个 Volley 请求