Размер объекта Java-файла, возвращающий 0 - PullRequest
0 голосов
/ 24 ноября 2018
System.out.print("1");
System.out.println(ts.getComponent());
System.out.println(ts.getTransferable().getTransferData(DataFlavor.javaFileListFlavor));
String dir = ts.getTransferable().getTransferData(DataFlavor.javaFileListFlavor).toString();

File file = new File(dir);
System.out.println(file.getName());
System.out.println(file.getPath());
System.out.println(file.getTotalSpace());

long num = file.length();
System.out.println(num);

Вывод

1javax.swing.JTable[,0,0,556x64,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder@1baabbd6,flags=251658568,maximumSize=,minimumSize=,preferredSize=,autoCreateColumnsFromModel=true,autoResizeMode=AUTO_RESIZE_SUBSEQUENT_COLUMNS,cellSelectionEnabled=false,editingColumn=-1,editingRow=-1,gridColor=javax.swing.plaf.ColorUIResource[r=35,g=35,b=36],preferredViewportSize=java.awt.Dimension[width=450,height=400],rowHeight=16,rowMargin=0,rowSelectionAllowed=true,selectionBackground=DerivedColor(color=57,105,138 parent=nimbusSelectionBackground offsets=0.0,0.0,0.0,0 pColor=57,105,138,selectionForeground=DerivedColor(color=255,255,255 parent=nimbusLightBackground offsets=0.0,0.0,0.0,0 pColor=255,255,255,showHorizontalLines=false,showVerticalLines=false]
[C:\Users\Ye\Desktop\Spotify.lnk]
Spotify.lnk]
[C:\Users\Ye\Desktop\Spotify.lnk]
0

Я не понимаю, как размер файла равен 0, несмотря на тестирование с несколькими файлами

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Кажется, проблема в пути String, который вы предоставляете конструктору File.Значение [C:\Users\Ye\Desktop\Spotify.lnk] не является допустимым именем пути для конструктора File для файла, к которому вы пытаетесь получить доступ.Это видно в выводе вашего оператора печати для file.getName(), который равен Spotify.lnk], а не Spotify.lnk.Файловый объект, размер которого вы пытаетесь получить, - это новый файл с именем Spotify.lnk **] **, который имеет размер 0.
Я не знаю, есть ли у васДругой способ получить имя файла, отличное от getTransferData(DataFlavor.javaFileListFlavor).toString(), но вы можете попытаться очистить имя файла, используя следующий код:

    String dirTemp = ts.getTransferable().getTransferData(DataFlavor.javaFileListFlavor).toString();
    dir = dirTemp.substring(1, dirTemp.length() - 1);
    // Then create the file using this dir String.
    File file = new File(dir);

Это будет работать для текущего вывода getTransferData()#toString(), который вы получаете, но может не работать, если, скажем, кто-то изменит реализацию toString().

Редактировать:

Как правильно указал @ MichaelA.Schaffrath, объект, возвращаемыйts.getTransferable().getTransferData(DataFlavor.javaFileListFlavor) на самом деле List<File>.Таким образом, нет необходимости создавать новый объект File снова.Просто приведите возвращенное значение как List и используйте первое значение для объекта File.

0 голосов
/ 24 ноября 2018

Скорее всего, вы либо проверяете длину каталога ИЛИ что указанное File не существует.

Из документацииFile.length возвращает:

Длина в байтах файла, обозначенного этим абстрактным путем, или 0L, если файл не существует.Некоторые операционные системы могут возвращать 0L для путей, обозначающих зависимые от системы объекты, такие как устройства или каналы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...