- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我刚刚发布了一个 Android 应用程序,它可以解析本地文件并对数据进行一些处理。几天前,我的一位客户向我报告了一个错误,每次他尝试处理他的文件时,应用程序都会崩溃。
这是他发给我的错误日志:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.NullPointerException: lock == null
at java.io.Reader.<init>(Reader.java:64)
at java.io.InputStreamReader.<init>(InputStreamReader.java:120)
与此相关的代码是这样的:
// EDIT 1: Following greenapps comment I will put a more realistic version of this
// method (The first version was invented because I wanted to be breaf)
public void selectFile()
{
List<File> files = getDocsToParse();
this.listview.setAdapter(this.myadapter);
this.listview.setOnItemClickListener(new OnItemClickListener()
{
...
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
parseFile(files.get(position));
}
...
}
this.myadapter.addFiles(files);
}
public static List<File> getDocsToParse() {
File sdcard = Environment.getExternalStorageDirectory();
File subdir = new File(sdcard, "MyAppFolder/Files/");
// EDIT 2: I'm using subdir.mkdirs(); because I want to
// create MyAppFolder/Files/ folders the first time the user use the app.
// Is this not correct? Should I create these folders any other way?
if (!subdir.exists()) {
subdir.mkdirs();
}
File files[] = subdir.listFiles();
List<File> filterFiles = new ArrayList<File>();
for (int i = 0; i < files.length; i++) {
File file = files[i];
filterFiles.add(file);
}
return filterFiles;
}
public void parseFile(File fileToParse)
{
long totalSize = 0;
InputStream is = null;
try {
totalSize = fileToParse.length();
is = new BufferedInputStream(new FileInputStream(fileToParse));
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader reader = null;
reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
String line = "";
StringTokenizer st = null;
try {
while ((line = reader.readLine()) != null) {
// Here I parse the file
}
} catch (IOException e) {
e.printStackTrace();
}
}
崩溃的是这一行:
reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
我知道这是因为“is”为 null,我必须捕获这种情况以避免应用程序崩溃(我将在下一个版本中修复此问题)。
编辑 3:你是对的,greenapps,我会在使用它之前检查它是否为空,否则我不会使用它。
我知道“is”是空的,因为有一个 IOException 这样做:
totalSize = fileToParse.length();
is = new BufferedInputStream(new FileInputStream(fileToParse));
编辑 4:当然,如果这给我一个 IOEXception,我将不得不更改我的代码以做出完全不同的事情。
而且我在 Internet 上找不到这两行代码可能引发 IOException 的原因。
我认为 fileToParse 没问题,或者至少不为空,因为我将这个"file"列表传递给适配器以使用 files.get(i).getName() 显示它们的文件名并且名称显示正确.
我必须补充一点,要处理的文件非常大并且包含敏感的个人数据,因此用户无法将其发送给我,因此我可以使用它进行测试。
我的文件都没有给我这个错误,如果没有有问题的文件,我很难追踪到问题,所以我不得不猜测。知道什么原因会导致此错误吗?
非常感谢和亲切的问候!
编辑 5:根据 ctarabusi 的建议,我将 parseFile 方法更改为:
public void parseFile(File fileToParse)
{
long totalSize = 0;
InputStream is = null;
try {
totalSize = fileToParse.length();
is = new BufferedInputStream(new FileInputStream(fileToParse));
BufferedReader reader = null;
reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
String line = "";
StringTokenizer st = null;
while ((line = reader.readLine()) != null) {
// Here I parse the file
}
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "Error parsing file", Toast.LENGTH_LONG).show();
e.printStackTrace();
} finally {
if(is != null)
{
try
{
is.close();
}
catch (IOException e)
{
Log.e("", e.getMessage(), e);
}
}
}
}
我的测试再次正常运行,但用户告诉我他看到了“错误解析文件”消息,所以测试失败了。
我还能检查什么?
最佳答案
您的问题可能是您没有关闭输入流。文件描述符和流是有限的资源,使用完后释放它们很重要。
通常在 finally block 中完成,例如:
InputStream inputStream = null;
try
{
... use your input stream
}
catch (IOException e)
{
Log.e(TAG, e.getMessage(), e);
}
finally
{
if (inputStream != null)
{
try
{
inputStream.close();
}
catch (IOException e)
{
Log.e(TAG, e.getMessage(), e);
}
}
}
关于android - BufferedInputStream 或 FileInputStream IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33570248/
1. 概述 在这个例子中,我们将使用一个BufferedInputStream类来读取一个文件。BufferedInputStream类是用来从流中读取信息的。它在内部使用了一个缓冲机制来使性能快速提
如果文件大小 > 8k,为什么读取的最后一个字节 = 0? private static final int GAP_SIZE = 8 * 1024; public static void main(
使用缓冲输入流读取批量文件时,如何确定缓冲区的大小?它基于文件大小吗?我正在使用, byte[] buf = new byte[4096]; 如果我增加缓冲区大小,它会读取得很快吗? 最佳答案 默认值
我正在尝试用java编写服务器端和客户端。因此,客户端发送请求,如 GET/HTTP/1.0,服务器端响应(如果文件存在),如 HTTP/1.0 200 OK,放入 header 内容类型和内容长度,
我的文件写入过程如下(我称之为非集群模式) Write an object to the current position of the file. Note the position of writ
我的 BufferedInputStream 没有正确标记。这是我的代码: public static void main(String[] args) throws Exception {
对于我的 jvm,BufferedinputStream 默认缓冲区大小是 8k。这是硬编码值,还是可以通过更改某些系统参数来更改? 我希望它在不修改 java 代码的情况下使用 128k。这可能吗?
我正在使用 BufferedInputStream 从套接字中读取数据。 BufferedInputStream 内容如下: socketInput.read(replyBuffer, 0, 7);
我知道将 BufferedInpurStream 包装在 FileInputStream 周围可以使读取操作更快但尝试 弄清楚如何。我查看了 BufferedInpurStream 的源代码并得到了一
让我在这篇文章的开头谨慎一点。当谈到 Java 时,我是一个完全的初学者。我一直在断断续续地编写 PHP,但我已经准备好做一个桌面应用程序,所以出于各种原因我决定使用 Java。 我正在处理的应用程序
这个问题在这里已经有了答案: 关闭11年前。 Possible Duplicate: In Java how do a read/convert an InputStream in to a stri
BufferedInputStream 介绍 BufferedInputStream 是缓冲输入流。它继承于FilterInputStream。 BufferedInputStream 的作用是为
是 available()在 Java 中的套接字编程中使用可靠吗? 我只关心它告诉我什么时候有可用的字节读取,这样当我调用读取方法时它们不会阻塞。 BufferedInputStream.avail
这是我的代码。 while ((count = in.read(data, 0, 16384)) != -1) // while there is still data from link to be
我通过 javax.sound.sampled.AudioSystem.getAudioInputStream() 从 URLConnection 获取 AudioInputStream。当将 URL
我需要使 java BufferedInputStream 可序列化。是否有任何替代方案或任何其他方式来实现它? 您是否发现此实现中存在任何问题 import java.io.BufferedInpu
我有 Java SSL/TLS 服务器和客户端套接字。我的客户端只需将文件发送到服务器,服务器就会接收它。这是我的代码: 我的客户端方法: static boolean writeData(Buffe
我正在从 Oracle 数据库读取 BLOB 列,然后将其写入文件,如下所示: public static int execute(String filename, BLOB blob)
有人可以向我解释为什么这在 in.available()>0 注释掉的情况下工作得很好,但是当我把它放回去时它就崩溃了? mySocket = new Socket("blahblah", 12345
有一个常见的模式,当应用程序的每一层处理来自流的数据时,倾向于将其包装到 BufferedInputStream 中,因此总的来说,有很多缓冲区,从缓冲区填充,从缓冲区填充等等。 我认为这是不好的做法
我是一名优秀的程序员,十分优秀!