07. september 2001 - 17:26
Der er
14 kommentarer og 2 løsninger
java og zip
Hm..jeg har lidt problemer med at hente de binære data fra en given fil fra en given zipfil, her er lidt kode: public byte[] getBinaryData(String entryName) { byte[] zipData = new byte[0]; ZipInputStream zipReader = new ZipInputStream(new InputStream()); ZipEntry zip; for (Enumeration e = myzip.entries(); e.hasMoreElements();) { zip = zipReader.getNextEntry(); if (zip.getName() == entryName) { zipReader.read(zipData, 0, zip.getSize()); } } return zipData; } Jeg får denne fejl: cnhwebZip.java:86: java.io.InputStream is abstract; cannot be instantiated ZipInputStream zipReader = new ZipInputStream(new InputStream()); Jeg kan åbenbart ikke oprette en InputStream, hvad skal jeg så gøre ?
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
07. september 2001 - 17:42
#1
Du kan ikke lave objekter af en abstract klasse - dvs new InputStream() kan ikke lade sig gøre. men hvordan du ellers skal løse dit problem skal jeg ikke lige umiddelbart kunne sige /Stine
07. september 2001 - 18:16
#3
Det du gør er at lave din egen klasse fx: public class A extends InputStream { } InputStream i = new A(); ZipInputStream zipReader = new ZipInputStream(i); nogenlunde som dette, jeg har ikke lige prøvet. /Stine
07. september 2001 - 19:10
#4
netsrac: Du skal bruge en InputStream eller en klasse der arver fra InputStream. Hvis du kan vente til Mandag, har jeg et komplet fungerende eksempel på arbejdet. Du kan f.eks. bruge en af følgende: AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream Jeg brugte selv en ByteArrayInputStream mener jeg :)
07. september 2001 - 19:41
#5
Lav det således: ZipInputStream zipReader = new ZipInputStream(new FileInputStream(\"filnavn.zip\"));
07. september 2001 - 23:11
#6
Okay, så kom jeg videre, hjælp mig lige med denne også, fatter det simpelt hen ikke: public byte[] getBinaryData(String entryName) { byte[] zipBytes = new byte[0]; ZipInputStream zipReader = new ZipInputStream(new FileInputStream(file)); ZipEntry zip; for (Enumeration e = myzip.entries(); e.hasMoreElements();) { zip = zipReader.getNextEntry(); if (zip.getName() == entryName) { zipReader.read(zipBytes, 0, zip.getSize()); } } return zipBytes; } Giver compile error: cnhwebZip.java:96: cannot resolve symbol symbol : method read (byte[],int,long) location: class java.util.zip.ZipInputStream zipReader.read(zipBytes, 0, zip.getSize()); ^ Den brokker sig altså over det med byte[] arrayet, men det skulle da være okay ?
08. september 2001 - 06:59
#7
Nej, byte arrayet er fint, bortset fra at det på kørselstidspunktet ikke kan indeholde nogle data, da det er erklæret med 0 pladser. Dit problem skyldes, at man skal angive en byte[], en int og en int for at få read til at virke, men prøv med følgende: if (zip.getName().equals(entryName)) <- Lav sammenligningen således { byte[] zipBytes = new byte[zip.getSize()]; <- Tilføjet zipReader.read(zipBytes); <-Rettet til. }
08. september 2001 - 10:27
#8
Gør jeg det på den måde får jeg at byte måske ikke er initaliseret, gør jeg det på følgendende måde får jeg altid det antal byte tilbage som jeg initaliserer med: public byte[] getBinaryData(String entryName) { byte[] zipBytes = new byte[0]; try { boolean found = false; ZipInputStream zipReader = new ZipInputStream(new FileInputStream(file)); ZipEntry zip; while (zipReader.available() != 1 && !found) { zip = zipReader.getNextEntry(); if (zip.getName().equals(entryName)) { Long totalBytes = new Long(zip.getSize()); zipBytes = new byte[totalBytes.intValue()]; zipReader.read(zipBytes, 0, totalBytes.intValue()); found = true; } /*if (zip.getName().equals(entryName)) { zipBytes = new byte[(int)zip.getSize()]; zipReader.read(zipBytes); found = true; } */ } } catch (Exception e) { } return zipBytes; }
08. september 2001 - 10:51
#9
Nå jeg smider lidt flere point på, den returnerer godt nok den første, men ikke de næste filer Mit testprogram: public class zipTest { public static void main(String args[]) { cnhwebZip zip = new cnhwebZip(); zip.open(\"c:\\\\hotel.zip\"); String[] list = zip.list(); System.out.println(list.length); for (int i = 0; i < list.length; i++) { byte[] test = zip.getBinaryData(list[i]); System.out.println(test.length + \" Bytes\"); } zip.close(); } } Mit program: import java.util.zip.*; import java.util.Enumeration; import java.util.Vector; import java.io.*; public class cnhwebZip { private boolean fileOpen; private ZipFile myzip; private String file; public void cnhwebZip() { fileOpen = false; } private void reset() { close(); open(file); } public boolean open(String file) { try { myzip = new ZipFile(file); fileOpen = true; this.file = file; } catch (Exception e) { } return fileOpen; } public boolean close() { try { myzip.close(); fileOpen = false; } catch (Exception e) { } return fileOpen; } public int size() { if (fileOpen == true) return myzip.size(); else return 0; } public String[] list() { Vector mylist = new Vector(); try { for (Enumeration e = myzip.entries(); e.hasMoreElements();) { mylist.addElement(e.nextElement()); } } catch (Exception e) { } String[] finalList = new String[mylist.size()]; for (int i = 0; i < mylist.size(); i++) { finalList[i] = ((ZipEntry) mylist.get(i)).getName(); } return finalList; } public byte[] getBinaryData(String entryName) { byte[] zipBytes = new byte[0]; reset(); try { ZipInputStream zipReader = new ZipInputStream(new FileInputStream(file)); ZipEntry zip; for (Enumeration e = myzip.entries(); e.hasMoreElements();) { zip = zipReader.getNextEntry(); if (zip.getName().equals(entryName)) { Long totalBytes = new Long(zip.getSize()); byte[] readBytes = new byte[totalBytes.intValue()]; zipReader.read(readBytes, 0, totalBytes.intValue()); return readBytes; } } } catch (Exception e) { } return zipBytes; } public boolean extractToFile(String entryName, String path) { boolean ok = false; try { File targetFile = new File(path + entryName); FileOutputStream out = new FileOutputStream(targetFile); out.write(getBinaryData(entryName)); ok = true; } catch (Exception e) { } return ok; } } Ved godt det er en ordentlig smøre, men håber i vil hjælpe mig, er ikke så stærk i java endnu.
09. september 2001 - 16:06
#10
Damn jeg har været en spade, jeg får jo InputStream foræret fra ZipFile, sådan her har jeg løst det: public byte[] getBinaryData(String entryName) { byte[] zipBytes = new byte[0]; try { ZipEntry zip = myzip.getEntry(entryName); InputStream zipReader = myzip.getInputStream(zip); Long totalBytes = new Long(zip.getSize()); byte[] readBytes = new byte[totalBytes.intValue()]; zipReader.read(readBytes, 0, totalBytes.intValue()); return readBytes; } catch (Exception e) { } return zipBytes; } Så er der en lille ting, den kan ikke finde ud af det når der er navne med æøå, hvordan løser man det ?
10. september 2001 - 07:39
#11
Fortæl mig hvordan du påviser problemer med æøå, altså er det navne inde i din zip fil, der ikke vises ordentlig på skærmen, eller hvordan?
10. september 2001 - 07:44
#12
Se jeg har denne public String[] list() der returnerer et array til mit testprogram, looper jeg igennem det og bruger min public byte[] getBinaryData(String entryName) med entryName fra mit array, så får jeg 0 byte tilbage når en fil i zip filen indeholder æøå i navnet.
10. september 2001 - 07:51
#13
Kig på karakterne du får fra både den ene og den anden, og find ud af hvilken, der fejler. Lidt ala: String s = .....someStringMaybeWithAnÆ int x = s.indexOf(\'æ\'); if (x != -1) { char ch = s.charAt(x); System.out.println(\"Dette æ er = \" + (int) ch); } Både din String[] list og zip.getName()skulle returnere samme værdi, så hvilken en af dem er det?
10. september 2001 - 07:55
#14
Måske du lige skulle se hvad ej siger her
http://www.eksperten.dk/spm/107662 Det må altså være min getBinaryData som fejler fordi den ikke kan finde ud af det.
10. september 2001 - 08:05
#15
Tja, ericjacobsen har tilsyneladende set problemet før, så jeg vil ikke sige mere til det. Det er sandsynligvis rigtigt.
10. september 2001 - 12:08
#16
Nå i deler :)
Kurser inden for grundlæggende programmering