Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-使用readLine以二进制形式读取文件_Java_Ruby_File_Groovy - Fatal编程技术网

Java-使用readLine以二进制形式读取文件

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

我有一个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
        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。我不建议你那样做。