2015-07-12 151 views
1

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

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

这是我的代码:

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编写和阅读。

我在这里错过了什么?

+0

我通过调用'writeFile()'和'readFile()'在'onCreate()'的末尾添加了你的代码。我在'logcat'输出中看到了示例文本。示例文本的结尾是一串长长的符号,它们是黑色钻石中的问号。你看到没有文字输出吗?只是钻石问号? –

+0

是的,我只看到带有上述代码的钻石问号。如果我将写入和读取代码放在一个方法中,我确实得到了原始字符串,没有任何菱形问号。 – user695752

+0

我的回答有用吗? –

回答

2

我还没有使用MemoryFile,只能从这个问题开始了解它。我查看了Android Studio中的源代码。我无法在Web上找到原始来源。 grepcode版本是here。从我的实验中查看源代码,很明显,我们期望从文件流获得的文件结束概念不适用于MemoryFile。文件结束时间基于MemoryFile构造函数中指定的长度,而不是写入文件的字节数。鉴于此,您在代码中使用的BufferedReader.readline()的行为没有得到很好的定义,因为它期望在字符流的末尾找到文件结束条件,并且它不会通过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作为其使用的示例有帮助。我没有找到其他好的例子。

0

我觉得问题是没有设置MemoryFile的长度。 memFile = new MemoryFile("MemoryFileTest", 1000000);

尝试memFile = new MemoryFile("MemoryFileTest", LENGTH_OF_YOUR_STRING);希望它有帮助。