app尝试调用BufferedReader.readLine()时崩溃了

时间:2016-04-14 14:50:31

标签: java android bufferedreader

我正在开发一个必须解析文件中文本的Android应用程序。

我的Parser.java类中有以下方法:

  $("#atualiza").click(function () {

    $(document).ajaxStart(function () {
        $("#carregando").show();
    });
    $(document).ajaxStop(function () {
        $("#carregando").hide();
    });           

        $.ajax({    
            url: '/Portaria/AtendOperador',
            dataType: "json",
            type: "GET",
            data: { 'data1': data1, 'data2': data2, 'evento': evento, 'cuc': cuc, 'conta': conta },

            //async: false, COMMENTED!!!           

            success: function (data) {    
                var Categories = new Array();
                var Series = new Array();    
                for (var i in data) {
                    Categories.push(data[i].Operador);
                    Series.push(data[i].Fechados);
                }    
                var CategArray = JSON.parse(JSON.stringify(Categories));
                atendOperador(CategArray, Series);
            },    
            error: function (xhr) {
                alert('error');
            }
        }); 
});

每当在while循环中调用buffer.readLine()方法时,我都会遇到问题。

我传入以下路径信息,File对象是:

private String getText(String fileName) {
        BufferedReader buffer = null;
        File file = new File(fileName);
        try{
           buffer  = new BufferedReader( new FileReader(file));
        }
        catch (FileNotFoundException e){
            System.out.println("Could not find file" + fileName);
        }

        String everything = null;
        try{
            StringBuilder builder = new StringBuilder();
            String line = null;

            while ((line = buffer.readLine()) != null){
                builder.append(line);
                builder.append(System.lineSeparator());
                line = buffer.readLine();
            }
            everything = builder.toString();
            //buffer.close();
        }
        catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        finally {
            if ((buffer != null)) {
                try {
                    buffer.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return everything;
    }

现在我已经查看了堆栈和在线上的大量帖子,以便尝试解决这个问题,并尝试使用thisthis中的一些解决方案,但没有运气。这是我得到的错误堆栈跟踪的片段。

"/Users/aa/Desktop/parser.txt"

我确信文件的路径是正确的,因为我在调试时检查了它。我不确定我还应该在这里考虑什么。

编辑:我正在开发OS X而不是Windows或Linux

2 个答案:

答案 0 :(得分:1)

您似乎正在尝试将本地(可能是Windows)文件路径传递到您的设备或模拟器。

"/Users/aa/Desktop/parser.txt"

这不起作用。您必须在Android项目中拥有该文件。您可以将它放在您的资源文件夹中并像这样访问它:

AssetManager manager = context.getAssets();
InputStream input = manager.open("parser.txt");

或者您可以将它放在原始文件夹中并像这样访问它:

InputStream input = context.getResources().openRawResource(R.raw.parser);

您在BufferedReader上获取null的原因是系统无法在Android项目中找到该文件路径。然后,正如评论中指出的那样,您没有正确处理异常并继续尝试读取流。

答案 1 :(得分:0)

有几件事:

@Directive({selector: 'myComponent'})
export class MyComponent {
  content:string;
  constructor(private _elRef: ElementRef) {}
  ngAfterContentChecked() {
     this.content = this._elRef.nativeElement.textContent; 
        // or maybe innerHTML, depending on what you want
     console.log('new value:', this.content);
  }
}

@Component({
  selector: 'my-app',
  template: `<myComponent>{{number}}</myComponent>
     <button (click)="number = number + 1">increment</button>
     <button (click)="0">do nothing event</button>
     <br>look at console log for directive binding updates`,
  directives: [MyComponent]
})
export class AppComponent {
  number = 123;
  constructor() { console.clear(); }
}

您需要删除注释行,因为您正在调用readLine两次。当您确实正确初始化缓冲区时,您将跳过行。

为了防止空指针异常,你应该:

  while ((line = buffer.readLine()) != null){
     builder.append(line);
     builder.append(System.lineSeparator());
     line = buffer.readLine();  //remove this line
   }