0

下面是显示内存不足问题的 logcat 结果。

它可能与太大的 byte[] 数组有关。


04-17 22:21:38.773: W/dalvikvm(4963): threadid=1: 线程退出未捕获异常 (group=0x40a4d1f8) 04-17 22:21:38.781: E/AndroidRuntime(4963): 致命异常: main 04-17 22:21:38.781: E/AndroidRuntime(4963): java.lang.OutOfMemoryError 04-17 22:21:38.781: E/AndroidRuntime(4963): 在 java.nio.CharBuffer.put(CharBuffer.java: 509) 04-17 22:21:38.781: E/AndroidRuntime(4963): 在 java.nio.charset.CharsetDecoder.allocateMore(CharsetDecoder.java:238) 04-17 22:21:38.781: E/AndroidRuntime(4963) : 在 java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:195) 04-17 22:21:38.781: E/AndroidRuntime(4963): 在 java.nio.charset.Charset.decode(Charset.java:487 ) 04-17 22:21:38.781: E/AndroidRuntime(4963): 在 java.lang.String.(String.java:174) 04-17 22:21:38.781: E/AndroidRuntime(4963): 在 java. lang.String.(String.java:141)

04-17 22:21:38.781: E/AndroidRuntime(4963): atexam.militarymgrs.Draw_LOS.readFile(Draw_LOS.java:182)

Draw_LOS.java:182 如下。(字符串 s = 新字符串(dat);)

- - - -源代码 - - - - - - -

public static ArrayList<String> readFile(String fileName) {
//map data access
String sdPath;
sdPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";

File file = new File(sdPath+fileName);
//String[] k = new String[1440000];
//String line = "";

ArrayList<String> data = new ArrayList<String>();//consider using ArrayList<int>
try {
FileInputStream fis = new FileInputStream(file);
byte[] dat = new byte[fis.available()];
String s = new String(dat);
String[] k = s.split("[\\r\\n]+");
while(fis.read(dat) != -1) {;}
fis.close();

}
catch(FileNotFoundException fN) {
fN.printStackTrace();
}
catch(IOException e) {
System.out.println(e);
}
return data; 
}

应该加载的文件如下

12 32 43 ...

如何使用 fileStream 在没有内存不足的情况下读取数据文件?

4

2 回答 2

1

尝试使用这个:

public static String toBinaryString(byte n) {
StringBuilder sb = new StringBuilder("00000000");
for (int bit = 0; bit < 8; bit++) {
if (((n >> bit) & 1) > 0) {
sb.setCharAt(7 - bit, '1');
}
}
return sb.toString();
}
于 2012-04-22T12:17:47.097 回答
0

而不是玩弄字节,你最好尝试一种不同的方法,将字符串解析留给字符串解析器并收集输出:

public static ArrayList<int> readFile(String fileName) {  // or ArrayList<short>
    String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";

    Scanner s = new Scanner(new FileInputStream(new File(sdPath + fileName)));

    ArrayList<int> data = new ArrayList<int>();

    while( s.hasNext() ) {
        data.add( s.nextInt() );
    }

    return data; 
}
于 2012-04-22T16:19:21.337 回答