如何在特定字符串完成之前逐个字符地读取文件?

时间:2018-02-06 03:41:42

标签: java

我为这个问题挣扎着解决我遇到的问题。我编写了一种压缩算法,它根据存储在数组中对象中的字符到代码对的列表压缩文本文件。现在解压缩时我意识到我必须逐个字符地读取每个文件,直到创建一个匹配其中一个代码的字符串,写下该代码对应的字符,并继续迭代该文件,直到它为止#39完了。

我不太确定从哪里开始,但到目前为止我的目标是:

{{1}}

还有更多的东西缺失,但它不应该非常重要,只是这个循环,我真的很难挣扎。

2 个答案:

答案 0 :(得分:1)

这里有一个完整的示例程序,说明了如何进行匹配。注意:如果您具有查找性能,则使用数组存储关联是一个糟糕的IDEA。但是,如果必须使用数组,则只需迭代数组,查找与搜索条件匹配的第一个查找关联。

来源

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class OpCodeLookupService {

Pair[] opCodes;

public static final class Pair {
    String first;
    String second;

    public Pair(String first, String second) {
        this.first = first;
        this.second = second;
    }
}

public OpCodeLookupService(Pair[] opCodes) {
    this.opCodes = opCodes;
}

public Pair pairLookup(String toLookup) {
    for(Pair p : this.opCodes) {
        if (p.first.equals(toLookup)) {
            return p;
        }
    }
    return null;
}

public String lookup(String filePath) {
    try {
        // In the comments, you mentioned you cannot use BufferedReader to ingest the file. In this example, I'm showing another way via Scanner which is a very easy to use class for ingesting input streams.
        Scanner s = new Scanner(new FileInputStream(filePath));
        StringBuilder stringToExamine = new StringBuilder();
        while (s.hasNext()) {
            String nextString = s.next();
            for (char c : nextString.toCharArray()) {
                stringToExamine.append(c);
                Pair pair = pairLookup(stringToExamine.toString());
                if (pair != null) {
                    return pair.second;
                }
            }
        }
        return null; //Indicates string is not found.
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        throw new RuntimeException("Cannot load file");
    }
}


public static void main(String...args) {
    final Pair p = new Pair("thisisopcode", "12345");
    Pair[] pairs = new Pair[1];
    pairs[0] = p;
    OpCodeLookupService opService = new OpCodeLookupService(pairs);
    System.out.println(opService.lookup("/Users/liuben10/foo.txt"));
  }
}

所以给出一个如下所示的文本文件:

" thisisopcodeklajsdfklajdsfkljadf",

它会输出:

" 12345"

答案 1 :(得分:0)

BufferedReader rd = new BufferedReader(new InputStreamReader(
         new FileInputStream(fName),"utf-8"));
int k;
String concatString ="";
while((k =rd.read())!=-1){
    if(concatString.equal(specificString) break;
    else concatString += (char)k;
}

//在字符串匹配时打破while循环