błąd spacji w nazwach plików - java.io.FileNotFoundException

0

Witam,

chciałem w ramach nauki inspirowany wątkami na forum odnośnie .zip i java napisać aplikacje do pakowania i rozpakowywania zipów, wszystko ładnie fajnie działa do momentu kiedy nazwy plików spakowanych zawierają "spacje". czytałem trochę na ten temat na forum https://4programmers.net/Forum/Java/156713-blad_gdy_sciezka_ze_spacja ale nie potrafię tego zastosować w moim kodzie.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class UnZip {
    
    private static final String INPUT_ZIP_FILE = "D:\\projekty w java.zip";
    private static final String OUTPUT_FOLDER = "D:\\testowe1";
    private static long rozmiar;
    private static long aktualnaWielkosc = 0;

    public UnZip(){
        try {
            rozmiar = new FileInputStream(INPUT_ZIP_FILE).available();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args)
    {
        UnZip unZip = new UnZip();
        unZip.unZipIt(INPUT_ZIP_FILE, OUTPUT_FOLDER);
    }

    private void unZipIt(String zipFile, String outputFolder)
    {
        byte[] buffer = new byte[1024];

        try{
            File folder = new File(OUTPUT_FOLDER);

            if (!folder.exists())
            {
                folder.mkdir();
            }
            FileInputStream test = new FileInputStream(zipFile);
            ZipInputStream zis = new ZipInputStream(test);
            ZipEntry ze = zis.getNextEntry();

            while (ze != null)
            {
                String fileName = ze.getName();
                File newFile = new File(outputFolder + File.separator + fileName);
                aktualnaWielkosc += ze.getSize();

                //obliczanie ile jest % już rozpakowane
                System.out.println( aktualnaWielkosc * 100 / rozmiar);

                new File(newFile.getParent()).mkdirs();

                FileOutputStream fos = new FileOutputStream(newFile);

                int len;
                while ((len = zis.read(buffer)) > 0)
                {
                    fos.write(buffer, 0, len);
                }

                fos.close();
                ze = zis.getNextEntry();
            }

            zis.closeEntry();;
            zis.close();
        } catch(IOException ex){
            ex.printStackTrace();
        }
    }
}

java.io.FileNotFoundException: D:\testowe1\projekty w java.metadata (System nie może odnaleźć określonej ścieżki)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
at UnZip.unZipIt(UnZip.java:63)
at UnZip.main(UnZip.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

w momencie gdy nie ma nigdzie spacji wszystko działa poprawnie.

0

Podobno File radzi sobie ze spacjami

rozmiar = new FileInputStream(new File(INPUT_ZIP_FILE)).available();
0

ale to nie jest problem przy pobieraniu wielkości pliku a w momencie "tworzenia" pliku po rozpakowaniu

FileOutputStream fos = new FileOutputStream(newFile);
0

zamień w string wszystkie " " na "%20" może zadziała :)

0

Zadziała

INPUT_ZIP_FILE = new URI("D:\\projekty%20w%20java.zip").toPath();

Intryguje mnie Twoje podejście do separatorów katalogów, czasem używasz "\" a czasem File.separator. Nie wiem jak na Macu-, w Linuksie i Windowsie działa taki separator "/".

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.