在java中读取文本文件

时间:2012-01-05 14:30:52

标签: java text-files

这里我试图读取每行只包含整数的文本文件。例如:

1 
2 

3 
1

我编写了以下代码来阅读文本文件。代码如下所示。

 package fileread;
 import java.io.*;

 public class Main {


public static void main(String[] args) {
    // TODO code application logic here
    try{
        FileInputStream fstream=new FileInputStream("C:/Users/kiran/Desktop/text.txt");
        DataInputStream in=new DataInputStream (fstream);
        BufferedReader br=new BufferedReader(new InputStreamReader(in));
        String str;
        while((str=br.readLine())!=null){
            System.out.println(str);
        }
        in.close();
    }
    catch(Exception e){
        System.err.println(e);
    }
}

}

现在我想只检索那些重复并显示给用户的整数。 在这种情况下,我想显示“1”。

我如何在Java中实现它?

8 个答案:

答案 0 :(得分:1)

您需要读取数组中的值,然后在该数组中查找重复的条目。

答案 1 :(得分:1)

package fileread;
import java.io.*;
import java.util.HashSet;
import java.util.Set;

public class Main {


public static void main(String[] args) {
    Set<String> uniqueLines = new HashSet<String>();
    Set<String> duplicatedLines = new HashSet<String>();
    try{
        FileInputStream fstream=new FileInputStream("C:/Users/kiran/Desktop/text.txt");
        DataInputStream in=new DataInputStream (fstream);
        BufferedReader br=new BufferedReader(new InputStreamReader(in));
        String str;
        while((str=br.readLine())!=null){
            if (uniqueLines.contains(str)) {
                if (!duplicatedLines.contains(str)) {
                    duplicatedLines.add(str);
                    System.out.println(str);
                }
            } else {
                uniqueLines.add(str);
            }
        }
        in.close();
    }
    catch(Exception e){
        System.err.println(e);
    }
}

}

注意:确保您的输入在每一行上没有尾随空格。另外请注意,当列表变长时,此实现并不特别符合内存。

答案 2 :(得分:0)

完全读取文件,将行保存到您选择的数据结构(map(key = line,value = count),数组只有整数),枚举数据结构并打印其值大于1的数据(如果值代表计数)。

或动态:读取文件,添加条目/列表/数组,如果未包含在set / list / array中,则打印出行。

答案 3 :(得分:0)

好吧,您可以使用一个包含10个插槽的数组,这些插槽映射到0到9之间的数字。对于每一行,您可以检查该数字是什么,并相应地增加数组中的值。它会是这样的:

// Initialize the array
int[] numberArray = new int[10];
for (int i = 0 ; i < 10 ; i++) numberArray[i] = 0;

while((str=br.readLine())!=null){
   int number = Integer.parseInt(str);
   numberArray[number]++;
}

for (int i = 0 ; i < 10 ; i++) {\
   if (numberArray[i] > 1) System.out.println(i);
}

答案 4 :(得分:0)

除了给定的答案之外,请确保将字符串转换为整数(数字)并捕获异常,以防来自文件的任何内容不是数字。在这种情况下,我认为您可以安全地忽略该异常,因为它不相关,但检查输入数据是一种很好的做法。

答案 5 :(得分:0)

像这样的东西

package fileread;

import java.io.*;

import java.util.*;

public class Main {

public static void main(String[] args) {

    Hashtable ht = new Hashtable();

    try{
        FileInputStream fstream =
           new FileInputStream("C:/Users/kiran/Desktop/text.txt");

        DataInputStream in=new DataInputStream (fstream);

        BufferedReader br=new BufferedReader(new InputStreamReader(in));

        String str;

        while((str=br.readLine())!=null){

            String sproof = (String) ht.get(str.trim());
            if (sproof != null && sproof.equals("1")) {
                System.out.println(str);
            } else {
                ht.put(str.trim(), "1");
            } 
        }
        in.close();
    }
    catch(Exception e){
        System.err.println(e);
    }
}

}

答案 6 :(得分:0)

首先,我将定义1个列表和1组整数,如下所示:

ArrayList<Integer> intList = new ArrayList<Integer>();
Set<Integer> duplicateIntSet = new HashSet<Integer>(); //Set is used to avoid duplicates

然后,我会检查重复项并将'em'添加到各自的列表中,如下所示:

while((str=br.readLine())!=null){
    if(!str.isEmpty()) {
        Integer i = Integer.parseInt(str);

        if(intList.contains(i)) {
            duplicateIntSet.add(i);
        } else {
            intList.add(i);
        }
    }
}

答案 7 :(得分:0)

我会使用两套方法;

public static void main(String[] args) {
    Set<Integer> result = new HashSet<Integer>();
    Set<Integer> temp = new HashSet<Integer>();

    try{
        FileInputStream fstream=new FileInputStream("text.txt");
        DataInputStream in=new DataInputStream (fstream);
        BufferedReader br=new BufferedReader(new InputStreamReader(in));
        String str;
        while((str=br.readLine())!=null){
            if (!"".equals(str.trim())){
                try {
                    Integer strInt = new Integer(str.trim());
                    if(temp.contains(strInt)){
                        result.add(strInt);
                    } else {
                        temp.add(strInt);
                    }
                } catch (Exception e){
                    // usually NumberFormatException
                    System.err.println(e);
                }
            }
        }
        in.close();
    }
    catch(Exception e){
        System.err.println(e);
    }
    for(Integer resultVal : result){
        System.out.println(resultVal);
    }
}

或者,您也可以使用单个HashMap,其中HashMap.Key作为Integer,HashMap.Value作为该Integer的计数。 然后,如果您以后需要重构以查找单个事件的所有实例,那么您可以轻松地执行此操作。

    public static void main(String[] args) {
    Map<Integer, Integer> frequency = new HashMap<Integer, Integer>();

    try{
        FileInputStream fstream=new FileInputStream("text.txt");
        DataInputStream in=new DataInputStream (fstream);
        BufferedReader br=new BufferedReader(new InputStreamReader(in));
        String str;
        while((str=br.readLine())!=null){
            if (!"".equals(str.trim())){
                try {
                    Integer strInt = new Integer(str.trim());
                    int val = 1;
                    if(frequency.containsKey(strInt)){
                        val = frequency.get(strInt).intValue() + 1;
                    } 
                    frequency.put(strInt, val);
                } catch (Exception e){
                    // usually NumberFormatException
                    System.err.println(e);
                }
            }
        }
        in.close();
    }
    catch(Exception e){
        System.err.println(e);
    }
    // this is your method for more than 1
    for(Integer key : frequency.keySet()){
        if (frequency.get(key).intValue() > 1){
            System.out.println(key);
        }
    }
    // This shows the frequency of values in the file. 
    for(Integer key : frequency.keySet()){
        System.out.println(String.format("Value: %s, Freq: %s", key, frequency.get(key)));
    }
}

注意NumberFormatExceptions,根据你的情况,你可以在循环内或循环外处理它们。