» »

[java] Kako v memoriji pretvoriti String objekt v File objekt ? - neka metoda ga zahteva, imam pa String

[java] Kako v memoriji pretvoriti String objekt v File objekt ? - neka metoda ga zahteva, imam pa String

Fizikalko ::

Živjo.

uporabljam določene API-je, katerih metode vzamejo LE File objekte, jaz pa imam String (dobljen preko streama) in ga res ne bi pisal v File in spet bral samo zato, da bo "pasal" v metodo.

Podoben problem je že nekdo tule odprl, da bo bolj jasno:
sun forum

Ima kdo na zalogi kakšno finto? Ker teh primerov ima že enih par, pa bi mi res obupno izgledalo, da bi kopico temp fajlov imel samo zaradi take banalnosti...

Res hvala vsakomur, ki bi pomagal.
  • spremenilo: Fizikalko ()

sverde21 ::

Bi lahko mogoče dal primer kode, kjer se pojavi težava, ker takole na pamet je težko kaj reči, ker ne vem katere metode tist tvoj API uporablja v File classu.

Sicer pa če se ti da, na tejle lokaciji (C:\Program Files\Java\jdk1.5.0_08\src.zip\java\io\File.java) imaš verjetno source tega Java classa in si lahko malce pomagaš z njim :) . Včasih je iz source-a lažje razbrati kaj, kot pa iz dokumentacije ;)
<?php echo `w`; ?>

Quikee ::

Težko lahko kaj (brez da bi poznal točno situacijo) - File je tak specifičen objekt, ki nima na sebi nič, kaj bi lahko tudi predpisal Stringu, samo čiste operacije nad File-i. S pomočjo File-a si api verjetno naredi FileInputStream, nad katerim manipulira. Če bi to bil recimo bolj splošen InputStream in bi njega zahteval kot input parameter potem ne bi bilo problema.

Mogoče bi lahko napisal svoj subclass od File-a ampak to je že mučkanje. ;)

Mogoče še bolj natančno razloži, kje in pri katerem api-ju imaš problem, ker mi zelo smrdi, kot da delaš nekaj hudo narobe, da si sploh do take situacije prišel.

kopernik ::

Najbrž obstaja nek razlog, da metoda zahteva File objekt. Ne vem, mogoče premika, preimenuje, popravlja timestampe na disku.

Subclass bi sicer lahko napisal, ampak potem bi moral vedeti, kaj ta metoda počne, da bi v tem subclassu ustrezno reagiral. Hmm, če se gre zgolj za testiranje, bi najbrž lahko uporabil easymock oz. kar direktno "dynamic proxies" mehanizem (od jave 1.3 naprej).

Fizikalko ::

Ok, hvala za odziv najprej, tule sta dva primera...

1. Gre za nek upload API ( klik), ki ga pač uporabljam, da iz neke forme na jspju lahko uploadam dva fajla na server. Žal ta API deluje tako, da je treba zapisat ta dva fajla na serverju v File objekta, jaz pa bi rad dobil pač STring objekta in delal z njima najprej...

konkretna koda, ki uporablja klaso v zgornjem linku:

if (name.equals("excelFile")){
FilePart filePart = (FilePart) part;
filePart.getInputStream();
String fileName = filePart.getFileName();
if (fileName != null) {
// the part actually contained a file
long size = filePart.writeTo(new File("D:\\temp\\"));
phoneList = ExcelReader.getPhoneArrayFromExcel("D:\\temp\\" + fileName);
//phonesCount = phonesCount + phoneList.size();
}
else {
// the field did not contain a file
System.out.println("file EMPTY");
}

}

if (name.equals("multimediaFile")){
FilePart filePart = (FilePart) part;
filePart.getInputStream();
String fileName = filePart.getFileName();

if (fileName != null) {
// the part actually contained a file
long size = filePart.writeTo(new File("D:\\temp\\"));
String filePath = "D:\\temp\\" + fileName;
try{
mimeContent = MIMEgenerator.getMIME(filePath, text);
System.out.println(mimeContent);
}
catch(Exception e){

}

}

Tu se takoj vidi še en problem - podobna težava je z MIME api-jem. Del moje getMime metode iz zadnjega dela zgornje kode:

MimeBodyPart messageBodyPart = new MimeBodyPart();
//messageBodyPart.setHeader("Content-Location","text1.txt");
messageBodyPart.setHeader("Content-Transfer-Encoding","quoted-printable");
messageBodyPart.setText(text, "utf-8");
multipart.addBodyPart(messageBodyPart);

// 3. priponka : slika iz datoteke.
messageBodyPart = new MimeBodyPart();
//messageBodyPart.setHeader("Content-Location","untitled.jpg");
FileDataSource fds = new FileDataSource(filePath);
messageBodyPart.setDataHandler(new DataHandler(fds));
messageBodyPart.setFileName(fds.getName());
multipart.addBodyPart(messageBodyPart);

ByteArrayOutputStream byos = new ByteArrayOutputStream();
message.writeTo(byos, new String[]{"Message-ID"});

File file = new File("d:/temp/test.mm");
FileOutputStream fos = new FileOutputStream(file);
fos.write(byos.toByteArray());
fos.flush();
fos.close();

Kako bi lahko pač pretvoril kakršenkoli vhod (npr. jpg) v MIME String, ne pa file?


2. No, še en primer (v bistvu že tretji)... Gre za API, ki se ga uporablja za prikazovanje SMIL xml datotek. Uporablja se sledeč API: xsmile

Koda:


String filename = null;

// Get the filename
if (args.length > 0) {
filename = args[0];
} else
filename = "D:\\example.smil";

System.out.println("SMILApp playing '"+filename);

// Create the SMIL player
JSMILPlayer smil = new JSMILPlayer();

// Initialize with the filename (could also be URL)
if (smil.init(filename) == false)
System.out.println("ERROR initializing "+filename);

// Create a frame and add the SMIL component to it
JFrame frame = new JFrame("Simple SMIL player");
frame.setSize(600,400);
frame.getContentPane().add(smil, BorderLayout.CENTER);
frame.show();

// Start the SMIL presentation
smil.start();

// Wait for 10 seconds
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
}

System.out.println("SMILApp stopping.");

// Stop the SMIL presentation
smil.stop();

// Remove the SMIL component from the frame
frame.removeAll();
frame.hide();

// Free memory
smil.destroy();

// Clear variables
frame = null;
smil = null;

// Exit
System.exit(0);



Evo, to so ti primeri. Vsakršna pomoč resnično dobrodošla...

Zgodovina sprememb…

  • spremenilo: Fizikalko ()

infiniteLoop ::

Razred FilePart ima v APIju tudi metodo:

public long writeTo(java.io.OutputStream out)

torej lahko naredis nekaj ala:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
filePart.writeTo(baos);
String vsebina = baos.toString ();
None of us is as dumb as all of us.

Fizikalko ::

Aha... problem je v tem, da v bistvu rabim točno ta upload-an excel potem dat v metodo, ki vzame bodisi InputStream ali pa File. Ali lahko ByteArrayOutput Stream mnekako pretvorim v InputStream objekt? Ker potem imam en problem rešen, takorekoč.

kopernik ::

Enostavno, uporabi new ByteArrayInputStream(baos.toByteArray()) in ga posreduj tisti metodi.

Zgodovina sprememb…

  • spremenil: kopernik ()

Fizikalko ::

OK, sem uspel nekako povezat, super. Najlepša hvala, prvi od treh problemov rešen! Hvala še enkrat. Sem spregledal, da lahko tudi tisti API v stream piše. Žal izgleda, da pri ostalih dveh primerih ni tako...

Fizikalko ::

Kaj pa tule:
// 3. priponka : slika iz datoteke.
messageBodyPart = new MimeBodyPart();
//messageBodyPart.setHeader("Content-Location","untitled.jpg");
FileDataSource fds = new FileDataSource(filePath);
messageBodyPart.setDataHandler(new DataHandler(fds));
messageBodyPart.setFileName(fds.getName());
multipart.addBodyPart(messageBodyPart);

Ta filepath je torej recimo lahko zdaj InputStream, dataHandler pa zahteva DataSource. Kot vidite, imam zaenkrat FileDataSource. Obstaja kak DataSource, ki je vezan na InputStream, ne na file in bi pasal v konstruktor DataHandler-ja?

Zgodovina sprememb…

  • spremenilo: Fizikalko ()

Fizikalko ::

Hja, zdajle sem, mislim tudi pri drugem primeru na pravi poti, a mi meče en Exception... Tkole je. Tale koda kliče getMime() metodo:

if (name.equals("multimediaFile")){
FilePart filePart = (FilePart) part;
InputStream mmStream = filePart.getInputStream();

try{
mimeContent = MIMEgenerator.getMIME(mmStream, text);
System.out.println("testiranje");
System.out.println(mimeContent);
}
catch(Exception e){

System.out.println(e.toString());
}

}

getMime pa imam takole:

public static String getMIME(InputStream mmStream, String text) throws Exception

{

MimeMessage message = new MimeMessage((Session)null);
MimeMultipart multipart = new MimeMultipart("related");
message.setContent(multipart);

message.setSubject("Testno sporocilo!");

MimeBodyPart messageBodyPart = new MimeBodyPart();
//messageBodyPart.setHeader("Content-Location","untitled.jpg");
ByteArrayDataSource ds = new ByteArrayDataSource(mmStream, "multimedia");
//FileDataSource fds = new FileDataSource(filePath);
messageBodyPart.setDataHandler(new DataHandler(ds));
multipart.addBodyPart(messageBodyPart);

ByteArrayOutputStream byos = new ByteArrayOutputStream();

message.writeTo(System.out);
//message.writeTo(byos, new String[]{"Message-ID"});

return byos.toString();

}

Napake mi mečejo writeTo metode in sicer gre za javax.mail.internet.ParseException.

Prej, ko sem imel namesto ByteArrayDataSource-a (narejen iz InputStreama, ki bere nek gif in je predan pač tejle metodi, kot vidite) FileDataSource, je bilo ok. Kaj je narobe?

infiniteLoop ::

edit: Predlagal bedarijo :8)
None of us is as dumb as all of us.

Zgodovina sprememb…

Fizikalko ::

BTW, ukvarjam se z eno Java web aplikacijo, ki bi poslal nek SMIL xml file, na primer takle:

http://www.streaming-media.biz/cnt330.h...


Vprašanje: kako, hudirja, bo prejemnik lahko dobil te midea source-e? Dobil bo le ta xml, ne pa teh vseh source-ov, ki so označeni z src, , jih pa zagotovo potrebuje.

Kaj mi je storiti?

infiniteLoop ::

Ce na hitro pogledam s cim se ukvarjas se mi zdi, da moras embeddati real player (oziroma katerkoli player s SMIL podporo )in mu potem kot src podturis ta SMIL file. Fajli, ki jih navajas v SMIL fajlu moraj pa po moj kmecki biti dostopni na naslovu, ki ga podas (torej na streziku). Tak se mi zdi po branju tega dokumenta. Drugace pa se na to niti malo ne spoznam, tak da zal zal.....
None of us is as dumb as all of us.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Java] Kako izračunati hash diska.

Oddelek: Programiranje
334710 (3540) kunigunda
»

[JAVA] HTTPS client

Oddelek: Programiranje
173047 (1777) peterv6i
»

Java skeniranje map in podmap

Oddelek: Programiranje
61066 (955) nightrage
»

[java] Runtime.exec()

Oddelek: Programiranje
111807 (1680) borchi
»

Kako pošiljanje datotek v JAVI.

Oddelek: Programiranje
141729 (1600) kopernik

Več podobnih tem