简体   繁体   中英

Error in reading file java.io

So i'm trying to read the following string from the text file addToLibrary.txt

 file:/Users/JEAcomputer/Music/iTunes/iTunes%20Media/Music/Flight%20Of%20The%20Conchords/Flight%20Of%20The%20Conchords/06%20Mutha'uckas.mp3

But when I do i get the following error:

java.io.FileNotFoundException: file:/Users/JEAcomputer/Music/iTunes/iTunes%20Media/Music/Flight%20Of%20The%20Conchords/Flight%20Of%20The%20Conchords/06%20Mutha'uckas.mp3 (No such file or directory)

Whats odd is that I got that string from a fileChooser using this method:

public static void addToLibrary(File f) {

    String fileName = "addToLibrary.txt";

    try {
        FileWriter filewriter = new FileWriter(fileName, true);
        BufferedWriter bufferedWriter = new BufferedWriter(filewriter);
        bufferedWriter.newLine();
        bufferedWriter.write(f.toURI().toString());
        System.out.println("Your file has been written");
        bufferedWriter.close();
    } catch (IOException ex) {
        System.out.println(
            "Error writing to file '"
            + fileName + "'");
    } finally {
    }
}

An even stranger error is that my file reader can read things in another folder but not anything in iTunes Media. I attempt to read all the files in the different folders with the following method:

public void getMusicDirectory() {
    int index = 0;
    try {


        File[] contents = musicDir.listFiles();
        //System.out.println(contents[3].toString());
        for (int i = 0; i < contents.length; i++) {
            //System.out.println("----------------------------------------"+contents.length);
            String name = contents[i].getName();
            //System.out.println(name);

            if (name.indexOf(".mp3") == -1) {
                continue;
            }

            FileInputStream file = new FileInputStream(contents[i]);
            file.read();
            System.out.println(contents[i].toURI().toString());
            songsDir.add(new Song((new MediaPlayer(new Media(contents[i].toURI().toString()))), contents[i]));
            file.close();
        }
    } catch (Exception e) {
        System.out.println("Error -- " + e.toString());
    }
    try(BufferedReader br = new BufferedReader(new FileReader("addToLibrary.txt"))) {

        //System.out.println("In check login try");
        for (String line; (line = br.readLine()) != null; ) {
            FileInputStream file = new FileInputStream(new File(line));
            file.read();
            songsDir.add(new Song(new MediaPlayer(new Media(line)), new File(line)));
            file.close();
        }
        // line is not visible here.
    } catch (Exception e) {
        System.out.println("Error reading add to library-- " + e.toString());
    }


} 

So how can i make this work? why does the first part of the method work but not the second?

You are not having a problem reading the string

file:/Users/JEAcomputer/Music/iTunes/iTunes%20Media/Music/Flight%20Of%20The%20Conchords/Flight%20Of%20The%20Conchords/06%20Mutha'uckas.mp3

from a file. That part works fine. Your problem is after that, when you try to open the file with the path:

file:/Users/JEAcomputer/Music/iTunes/iTunes%20Media/Music/Flight%20Of%20The%20Conchords/Flight%20Of%20The%20Conchords/06%20Mutha'uckas.mp3

because that's not actually a path; it's a URI (although it can be converted to a path).

You could convert this to a path, in order to open it, but you have no reason to - your code doesn't actually read from the file (apart from the first byte, which it does nothing with) so there's no point in opening it. Delete the following lines:

FileInputStream file = new FileInputStream(contents[i]); // THIS ONE
file.read(); // THIS ONE
System.out.println(contents[i].toURI().toString());
songsDir.add(new Song((new MediaPlayer(new Media(contents[i].toURI().toString()))), contents[i]));
file.close(); // THIS ONE

and

FileInputStream file = new FileInputStream(new File(line)); // THIS ONE
file.read(); // THIS ONE
songsDir.add(new Song(new MediaPlayer(new Media(line)), new File(line)));
file.close(); // THIS ONE

file:/Users/JEAcomputer/Music/iTunes/iTunes%20Media/Music/Flight%20Of%20The%20Conchords/Flight%20Of%20The%20Conchords/06%20Mutha'uckas.mp3 is not a valid File reference, especially under Windows.

Since you've idendtified the String as a URI, you should treat it as such...

URI uri = URI.create("file:/Users/JEAcomputer/Music/iTunes/iTunes%20Media/Music/Flight%20Of%20The%20Conchords/Flight%20Of%20The%20Conchords/06%20Mutha'uckas.mp3");

Okay, but, there's no real way to read URI , but you can read a URL , so we need to convert the URI to URL , luckily, this is quite simple...

URL url = uri.toURL();

From there you can use URL#openStream to open an InputStream (which you can wrap in a InputStreamReader ) and read the contents of the file, for example...

String imageFile = "file:/...";
URI uri = URI.create(imageFile);
try {
    URL url = uri.toURL();
    try (InputStream is = url.openStream()) {

        byte[] bytes = new byte[1024 * 4];
        int bytesRead = -1;
        int totalBytesRead = 0;
        while ((bytesRead = is.read(bytes)) != -1) {

            // Somthing, something, something, bytes
            totalBytesRead += bytesRead;

        }

        System.out.println("Read a total of " + totalBytesRead);

    } catch (IOException ex) {
        ex.printStackTrace();
    }
} catch (MalformedURLException ex) {
    ex.printStackTrace();
}

You could, however, save your self a lot of issues and stop using things like f.toURI().toString()); ( File#toURI#toString ) and simply use File#getPath instead...This would allow you to simply create a new File reference from the String ...

Also, your resource management needs some work, basically, if you open it, you should close it. See The try-with-resources Statement for some more ideas

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM