Java-使用readLine以二进制形式读取文件
我有一个Ruby代码,它逐行读取文件,并检查它是否需要读取某个块的下一行,或者它应该处理该块并继续读取文件解析每一行 给你:Java-使用readLine以二进制形式读取文件,java,ruby,file,groovy,Java,Ruby,File,Groovy,我有一个Ruby代码,它逐行读取文件,并检查它是否需要读取某个块的下一行,或者它应该处理该块并继续读取文件解析每一行 给你: File.open(ARGV[0], 'rb') do |f| fl = false text = '' f.readlines.each do |line| if (line =~ /^end_block/) fl = false # parse text variable
File.open(ARGV[0], 'rb') do |f|
fl = false
text = ''
f.readlines.each do |line|
if (line =~ /^end_block/)
fl = false
# parse text variable
end
text += line if fl == true
if (line =~ /^start_block/)
fl = true
end
end
end
例如,我需要打开文件以读取二进制文件,但我仍然需要一个readLine
方法
因此,问题是:如何使用Groovy/Java实现完全相同的功能?如果您使用的是行格式文本,那么这不是二进制IMHO。这是因为真正的二进制可以有任何字节,甚至是
新行
和回车
,这会在代码中造成错误的中断
您可能的意思是,您有文本,您希望读取每个字节而不编码或可能损坏它们。这与使用ISO-8859-1
相同
你可以试试
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(filename), "ISO-8859-1"));
StringBuilder sb = new StringBuilder();
String line;
boolean include = false;
while((line = br.readLine()) != null) {
if (line.startsWith("end_block"))
include = false;
else if (line.startsWith("start_block"))
include = true;
else if (include)
sb.append(line).append('\n'); // new lines back in.
}
br.close();
String text = sb.toString();
也许是这样的:
public final class Read
{
private static final Pattern START_BLOCK = Pattern.compile("whatever");
private static final Pattern END_BLOCK = Pattern.compile("whatever");
public static void main(final String... args)
throws IOException
{
if (args.length < 1) {
System.err.println("Not enough arguments");
System.exit(1);
}
final FileReader r = new FileReader(args[0]);
final BufferedReader reader = new BufferedReader(r);
final StringBuilder sb = new StringBuilder();
boolean inBlock = false;
String line;
while ((line = reader.readLine()) != null) {
if (END_BLOCK.matcher(line).matches()) {
inBlock = false;
continue;
}
if (inBlock)
sb.append(line);
if (START_BLOCK.matcher(line).matches())
inBlock = true;
}
System.out.println(sb.toString());
System.exit(0);
}
}
公共最终课堂阅读
{
私有静态最终模式START_BLOCK=Pattern.compile(“任意”);
私有静态最终模式END_BLOCK=Pattern.compile(“任意”);
公共静态void main(最终字符串…参数)
抛出IOException
{
如果(参数长度<1){
System.err.println(“参数不足”);
系统出口(1);
}
最终文件读取器=新文件读取器(args[0]);
最终BufferedReader读取器=新的BufferedReader(r);
最终StringBuilder sb=新StringBuilder();
布尔内块=假;
弦线;
而((line=reader.readLine())!=null){
if(END_BLOCK.matcher(line.matches()){
inBlock=false;
继续;
}
如果(块内)
某人附加(行);
if(启动\u BLOCK.matcher(line.matches())
inBlock=true;
}
System.out.println(sb.toString());
系统出口(0);
}
}
您可以使用java.io.DataInputStream
,它提供了readLine()
方法和readFully(byte[])
和read(byte[])
方法
警告:读取行的JavaDoc表示,它已被弃用,编码可能不合适(请阅读JavaDoc中的详细信息)
因此,请仔细考虑您的实际需求,如果这对您来说是一个合适的权衡。@fge抱歉,我不理解您的问题……您似乎正在阅读文本,因此提出了这个问题。这仅仅是因为您使用rb打开文件吗?这是否保留了原始的新行?嗯,我正试图在这些文本块上调用一个膨胀。所以,我需要它们是二进制的。不管我怎么做(比如这里:),我都会得到
java.util.zip.DataFormatException:unknown compression method
异常。所以,我认为这可能是由于错误的文件读取格式造成的…当您读取压缩文件时,首先必须解压缩它。您可以先在Java中或在命令行中执行此操作。它不仅仅知道如何将压缩文件作为未压缩数据读取。(如果Ruby自动为您执行此操作,我会感到惊讶)鉴于您的错误消息,您确定它是用ZIP压缩的吗?否=)更重要的是,我确定它不是。我正在尝试读取PDF文件=)要获取zip.DataFormatException,您必须使用正在尝试读取zip文件的库。e、 g.ZIPInputStream。我不建议你那样做。