Java:从文本文件中检索和删除随机行

Java:从文本文件中检索和删除随机行,java,io,Java,Io,我需要从txt文件中检索并删除随机行(同一行)。到目前为止,我已经提出了以下代码: public String returnAndDeleteRandomLine(String dir) throws FileNotFoundException, IOException { try (BufferedReader br = new BufferedReader(new FileReader(dir))) { //StringBuilder sb = new String

我需要从txt文件中检索并删除随机行(同一行)。到目前为止,我已经提出了以下代码:

 public String returnAndDeleteRandomLine(String dir) throws FileNotFoundException, IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(dir))) {
        //StringBuilder sb = new StringBuilder();
        //System.out.println("Value of line before while() " + line);

        ArrayList fileContents = new ArrayList();
        int maxLines = 0;


        String line = br.readLine();
        //System.out.println("Value of line before while() " + line);

        while (line != null) {
            fileContents.add(line.toString());
            line = br.readLine();
            //System.out.println("Value of line is: " + line);
        }

        System.out.println("Value of maxLines() " + maxLines);

        Random rand = new Random();
        int randomNumber = rand.nextInt(maxLines - 1) + 1;
        System.out.println("Value of randomNumber: " + randomNumber);
        int lineNumber = randomNumber;

        if (fileContents.isEmpty()) {
            return null;
        } else System.out.println("Value of random line: " + fileContents.get(randomNumber).toString());
        return fileContents.get(randomNumber).toString();
    }


 }
但我总是会犯不同的错误。最近的错误是:

线程“main”中maxLines()0异常的值 java.lang.IllegalArgumentException:绑定必须在 java.util.Random.nextInt(未知源代码)位于 TransmitToFile.returnAndDeleteRandomLine(TransmitToFile.java:247)位于 Main.Main(Main.java:98)


我甚至无法删除该行,因为我仍然无法检索该行。

问题在于该行

int randomNumber = rand.nextInt(maxLines - 1) + 1;

如果
maxLines
0
,则调用
rand.nextInt(-1)
。因此,此参数必须为正的错误。

您忘记了,因此将变量
maxLines
的值设置为文件中的行数,并且由于其为0,因此会出现异常

您可以添加新方法以获得如下行号(如此答案所示:):

并将代码更改为:

int maxLines = 0;
致:


因此,
maxLines
变量将等于文件中的行数。

错误在这一行:

int randomNumber = rand.nextInt(maxLines - 1) + 1;
您应该先添加一个复选框来检查尺寸:

int totalLines = maxLines - 1;
if(totalLines > 0) {
    Random rand = new Random ();
    int randomNumber = rand.nextInt (totalLines) + 1;
    System.out.println("Value of randomNumber: " + randomNumber);
    } else {
        return null;
    }
Random.nextInt(N)
提供
0。。N-1
。由于所有指数都是从0开始计算的,而人类是从1开始计算的,所以出现了混淆

通用代码可以做得更简单:

public static String returnAndDeleteRandomLine(String dir) throws IOException {
    Path path = Paths.get(dir);
    List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
    if (lines.isEmpty()) {
        throw new IOException("Empty file: " + dir);
    }
    Random rand = new Random();
    int lineIndex = rand.nextInt(lines.size()); // 0 .. lines.size() - 1
    String line = lines.get(lineIndex);

    System.out.printf("Line %d: %s%n", (lineIndex + 1), line);

    lines.remove(lineIndex);
    Files.write(path, lines, StandardCharsets.UTF_8,
            StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING);
    return line;
}
publicstaticstringreturnanddeleterandomline(stringdir)抛出IOException{
Path=Path.get(dir);
列表行=Files.readAllLines(路径,StandardCharsets.UTF_8);
if(lines.isEmpty()){
抛出新IOException(“空文件:+dir”);
}
Random rand=新的Random();
int lineIndex=rand.nextInt(lines.size());//0..lines.size()-1
String line=lines.get(lineIndex);
System.out.printf(“第%d行:%s%n”,(lineIndex+1),第行);
行。删除(行索引);
写入(路径、行、标准字符集.UTF_8、,
StandardOpenOption.WRITE,StandardOpenOption.TRUNCATE_现有);
回流线;
}
如果文件为空(maxlines=0),此解决方案仍将失败,因此您还应检查(maxlines=0)是否返回;或者别的什么。在现实生活中可能不是什么大问题,但值得注意。
int totalLines = maxLines - 1;
if(totalLines > 0) {
    Random rand = new Random ();
    int randomNumber = rand.nextInt (totalLines) + 1;
    System.out.println("Value of randomNumber: " + randomNumber);
    } else {
        return null;
    }
public static String returnAndDeleteRandomLine(String dir) throws IOException {
    Path path = Paths.get(dir);
    List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
    if (lines.isEmpty()) {
        throw new IOException("Empty file: " + dir);
    }
    Random rand = new Random();
    int lineIndex = rand.nextInt(lines.size()); // 0 .. lines.size() - 1
    String line = lines.get(lineIndex);

    System.out.printf("Line %d: %s%n", (lineIndex + 1), line);

    lines.remove(lineIndex);
    Files.write(path, lines, StandardCharsets.UTF_8,
            StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING);
    return line;
}