【问题标题】:Writing to Text File from Comma Delimited ArrayList从逗号分隔的 ArrayList 写入文本文件
【发布时间】:2015-02-27 04:57:26
【问题描述】:

我创建了一个包含歌曲数据成员(标题、艺术家、专辑、长度)的歌曲类。我已经有一个 .txt 文件,其中包含存储在数组列表中的不同歌曲。用户完成添加或删除歌曲后,程序应以文本文件的原始格式(逗号分隔)写入文本文件。

我的问题是程序在没有逗号的情况下写入文件,当我通过获取 ArrayIndexOutOfBoundsException 重新运行它时,它导致我的程序崩溃。我曾尝试使用嵌套的 for 循环和 printf 函数,但没有成功。如何以原始格式写入文件并避免在写入并尝试再次运行后崩溃?

这是 .txt 文件的格式
岩龙虾,B-52 的,B-52 的,4:37
像埃及人一样走路,手镯,不同的光,3:24

这是我的带有 toString() 方法的 Song 类

public class Song {
    //Declaring all data members.
    private String title;
    private String artist;
    private String album;
    private String length;
    private static int songCounter = 0;

    //Constructors for Song class.      
    public Song(String title, String artist, String album, String length){
        this.title = title;
        this.artist = artist;
        this.album = album;
        this.length = length;
        songCounter++;
    }
    //Get and Set methods 
    public String getTitle(){
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getArtist(){
        return artist;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }

    public String getAlbum(){
        return album;
    }

    public void setAlbum(String album){
        this.album = album;
    }

    public String getLength(){
        return length;
    }

    public void setLength(String length){
        this.length = length;
    }

    public static int getSongCounter(){
        return songCounter;
    }
    public int compareArtist(Song o){
        return artist.compareTo(o.artist);
    }
    public int compareTitle(Song o){
        return title.compareTo(o.title);
    }
    //Overriding the toString() function.
    @Override
    public String toString(){
        return title +","+artist+","+album+","+length;
    }
}      

这是我的主类,它从文件中读取并包含一个写入方法

public class Library {

public static void main(String[] args) {
    ArrayList <Song> songList = new ArrayList <Song> ();
    boolean repeat = true;

    try{
        Scanner read = new Scanner (new File("SongList.txt"));
        do{
            String line = read.nextLine();
            String [] tokens = line.split(",");
            songList.add(new Song(tokens[0], tokens[1], tokens[2], tokens[3]));
        }while(read.hasNext());
        read.close();
    }catch (FileNotFoundException e){
        System.out.println("File not found.");
    }

    while ( repeat ){
        System.out.println("\nSelect a Function");
        System.out.println("1. Search Song");
        System.out.println("2. Add Song");
        System.out.println("3. Delete Song");
        System.out.println("4. Display Songs");
        System.out.println("5. Quit");

        switch (MenuInputCheck(1, 5)){

        case 1: searchSong(songList);
                break;
        case 2: addSong(songList);
                break;
        case 3: deleteSong(songList);
                break;
        case 4: displaySorted(songList);
                break;
        case 5: saveFile(songList);
                repeat = false;
                break;
        }
    }
}

public static void saveFile(ArrayList <Song> songList){
    try{
        PrintWriter writer = new PrintWriter("SongList.txt");
        for (int i = 0; i < songList.size();i++){
            writer.println(i);
        }
        writer.close();
    } catch (FileNotFoundException e){
        System.out.println("File not found.");
    }
}

【问题讨论】:

    标签: java file-io arraylist delimiter printwriter


    【解决方案1】:

    目前代码只是写一个integer

     for (int i = 0; i < songList.size();i++){
            writer.println(i);
     }
    

    我建议您在Song 中创建一个方法,该方法将写入由逗号分隔的字段

    例如

    public String writeMe () {
       StringBuffer buf = new StringBuffer ();
       buf.append (name).append(",").append(artist).....;
    
       return buf.toString ();
    

    }

    然后在你的循环调用中

    writer.write (singList.get(i).writeMe ();
    

    更新

    使用您更新的代码,您可以获得输出

    writer.println(song.toString());
    

    【讨论】:

    • 我用我的 Song 类编辑了我的帖子,其中包括一个用逗号分隔的 toString() 方法。我的循环中的调用是否与您的建议相似?
    • 是的,writer.println(song.toString());会好的
    • 您应该考虑使用 CSV 库来避免常见的 csv 问题,例如嵌入式逗号等。
    【解决方案2】:

    您正在将i 的值写入文件??你应该写歌曲信息。在您的Song 课程缺席的情况下,我只是在弥补字段和方法

    如果您使用的是 Java 8,则可以使用 StringJoiner API...

    public static void saveFile(ArrayList <Song> songList){
        try{
            PrintWriter writer = new PrintWriter("SongList.txt");
            for (Song song : songList){
                StringJoiner sj = new StringJoiner(",");
                sj.add(song.getTitle());
                sj.add(song.getArtiest());
                sj.add(song.getAlbum());
                sj.add(song.getDuration());
                writer.println(sj.toString());
            }
            writer.close();
        } catch (FileNotFoundException e){
            System.out.println("File not found.");
        }
    }
    

    否则,您将需要使用 String#formatStringBuilder 之类的东西来生成输出...

    现在可能是时候向您介绍JAXB...

    更新

    因此,根据您更新的代码,包括Song 类,您应该能够做一些简单的事情......

    public static void saveFile(ArrayList <Song> songList){
        try{
            PrintWriter writer = new PrintWriter("SongList.txt");
            for (Song song : songList){
                writer.println(song.toString());
            }
            writer.close();
        } catch (FileNotFoundException e){
            System.out.println("File not found.");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 2011-09-08
      相关资源
      最近更新 更多