„0x0A”
„0x0D0A”
„0x0D”
oder
„0x0A”
„line.separator”.
Das folgende Snippet stellt eine Methode dar, die immer einen korrekten Zeilenumbruch liefert.
public static String nl() {
return System.getProperty("line.separator");
}
/* Usage:
System.out.print("Die Sterntaler" + nl() + "Es war einmal ...");
*/
„file.separator”.
Um sich einen Überblick zu verschaffen, testen Sie doch bitte folgendes Snippet.
java.util.Properties ps = System.getProperties();
for (Object key : ps.keySet()) {
System.out.println(String.format("%s='%s'", key, ps.get(key)));
}
/* Output-Snippet:
...
user.country='DE'
user.language='de'
...
os.name='Windows XP'
os.version='5.1'
os.arch='x86'
...
java.version='1.6.0_15'
...
file.separator='\'
...
*/
split(String regex)
eignet sich besonders gut zur Deserialisierung von einfachen Listen.
Wenn zum Beispiel ein kommaseparierter String
(csv)
vorliegt, hilft die Stringmethode
split().
String.split()
wäre ebenfalls eine nette Aufgabe.
Strings.getFirst()
Strings.getLast()
null
muss dabei nicht geprüft werden.
public class Strings {
public static String getFirst(String separatedList, String separator) {
if ((separatedList != null) && (separator != null)) {
for (String first : separatedList.split(separator)) {
return first;
}
}
return "";
}
// Usage:
// System.out.println(Strings.getFirst("bob@openimscore.org", "@"));
public static String getLast(String separatedList, String separator) {
String result = "";
if ((separatedList != null) && (separator != null)) {
for (String item : separatedList.split(separator)) {
result = item;
}
}
return result;
}
// Usage:
// System.out.println(Strings.getLast("www.stefan-baur.de", "."));
// ...
fileCopy
implementiert das Kopieren einer beliebigen Datei.
Die Eingabedatei
from
wird
KB-weise
in die Ausgabedatei
to
kopiert.
Um die Ausnahme
FileNotFoundException
zu vermeiden, muss die Eingabedatei sowie das Verzeichnis der Ausgabedatei existieren.
Die Rückgabe der Funktion stellt die Gesamtanzahl der kopierten Zeichen dar.
FileReader
und
FileWriter
zu implementieren, schlug aufgrund von
Encoding-Problemen
fehl;
Nicht jede Ausgabedatei war mit der Eingabedatei identisch.
Encoding-Probleme
gab es generell mit Binärdateien und so mancher
RTF-Datei.
Daher entschied ich mich für die FileStreams
FileInputStream
und
FileOutputStream.
public static int fileCopy(String from, String to) throws IOException {
int result = 0;
byte[] buffer = new byte[1024];
FileInputStream in = new FileInputStream(from);
FileOutputStream out = new FileOutputStream(to);
for (int count = 0; (count = in.read(buffer)) != -1; result += count) {
out.write(buffer, 0, count);
}
in.close();
out.close();
return result;
}
// Usage:
// int fileSize = fileCopy("input.txt", "output.txt");
dirCopy
ist dazu da, das gegebene Verzeichnis
from
mit samt seinen Inhalten und Unterverzeichnissen rekursiv in das Ausgabeverzeichnis
to
zu kopieren.
public static void dirCopy(File from, File to) throws IOException {
if (from.isDirectory()) {
/* Verzeichnis kopieren */
if (!to.exists()) {
to.mkdirs();
}
for (String child : from.list()) {
dirCopy(new File(from, child), new File(to, child));
}
} else {
/* Datei kopieren */
byte[] buffer = new byte[1024];
FileInputStream in = new FileInputStream(from);
FileOutputStream out = new FileOutputStream(to);
for (int count = 0; (count = in.read(buffer)) != -1;) {
out.write(buffer, 0, count);
}
in.close();
out.close();
}
}
// Usage:
// dirCopy(new File("C://Meins"), new File("C://Deins"));
public static JMenu createLookAndFeelMenu(Component component) {
JMenu result = new JMenu("Look and Feel");
ButtonGroup group = new ButtonGroup();
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
JRadioButtonMenuItem item = new JRadioButtonMenuItem(info.getName());
group.add(item);
result.add(item);
item.putClientProperty("INFO", info);
item.putClientProperty("COMPONENT", component);
item.setSelected(UIManager.getLookAndFeel().getName().equals(info.getName()));
item.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent ie) {
JRadioButtonMenuItem item =
(JRadioButtonMenuItem)ie.getSource();
if (item.isSelected()) {
LookAndFeelInfo info = (LookAndFeelInfo)item.getClientProperty("INFO");
Component component = (Component)item.getClientProperty("COMPONENT");
try { UIManager.setLookAndFeel(info.getClassName()); }
catch (Exception e) { e.printStackTrace(); }
SwingUtilities.updateComponentTreeUI(component);
}
}
});
}
return result;
}
/* Usage:
JFrame frame = new JFrame();
JMenuBar menuBar = new JMenuBar();
menuBar.add(createLookAndFeelMenu(frame));
frame.setJMenuBar(menuBar);
frame.setVisible(true);
*/
private void setLookAndFeel(String[] prio) {
for (String name : prio) {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if (info.getName().equals(name)) {
try {
UIManager.setLookAndFeel(info.getClassName());
SwingUtilities.updateComponentTreeUI(this);
return;
} catch (Exception e) { e.printStackTrace(); }
}
}
}
}
/* Usage:
this.setLookAndFeel(new String[] { "Nimbus", "GTK++", "Metal", "Windows" });
*/
„getInstance()”.
Ähnlich wie beim Konstruktor
„new”
gibt auch die Methode
„getInstance()”
immer eine Instanz der Klasse
(hier: MySingleton)
zurück, nur mit dem wesentlichen Unterschied,
dass immer die selbe Instanz zurückgegeben wird.
public class MySingleton {
private static MySingleton self = null;
private MySingleton() {}
public static MySingleton getInstance() {
if (self == null) {
self = new MySingleton();
}
return self;
}
public void yourMethod() {
System.out.println("dummy");
}
}
/* Usage:
MySingleton.getInstance().yourMethod();
*/
// Visitor.java
public interface Visitor<R, A> {
R visit(NodeA nodeA, A argument);
R visit(NodeB nodeB, A argument);
// NodeC, ...
}
// Visitable.java
public interface Visitable {
<R, A> R accept(Visitor<R, A> visitor, A argument);
}
// NodeA.java (dummy)
public class NodeA implements Visitable {
public <R, A> R accept(Visitor<R, A> visitor, A argument) {
return visitor.visit(this, argument);
}
// your code here
}
// NodeB.java (dummy)
public class NodeB implements Visitable {
public <R, A> R accept(Visitor<R, A> visitor, A argument) {
return visitor.visit(this, argument);
}
}
// NodeC.java, ...
// ClassNameVisitor.java (dummy)
public class ClassNameVisitor implements Visitor<String, Boolean> {
public String visit(NodeA nodeA, Boolean simple) {
if (simple) return nodeA.getClass().getSimpleName();
else return nodeA.getClass().getName();
}
public String visit(NodeB nodeB, Boolean simple) {
if (simple) return nodeB.getClass().getSimpleName();
else return nodeB.getClass().getName();
}
// NodeC, ...
}
import java.awt.event.*;
import javax.swing.*;
public class MyThreadFrame extends JFrame implements Runnable {
private static final long serialVersionUID = 1L;
public MyThreadFrame() {
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) { System.exit(0); }
public void windowDeiconified(WindowEvent e) { start(); }
public void windowIconified(WindowEvent e) { stop(); } });
}
private Thread myThread;
public void start() {
this.myThread = new Thread(this);
this.myThread.setPriority(Thread.MIN_PRIORITY);
this.myThread.start();
}
public synchronized void stop() {
this.myThread = null;
}
public void run() {
Thread currentThread = Thread.currentThread();
while (this.myThread == currentThread) {
this.dummyAction(); // Replace it with your action!
try { Thread.sleep(10); }
catch (InterruptedException e) { break; }
}
this.myThread = null;
}
private int dummyCounter = 0;
private void dummyAction() {
this.setTitle(String.format("%d", this.dummyCounter++));
}
public static void main(String arguments[]) {
MyThreadFrame myThreadFrame = new MyThreadFrame();
myThreadFrame.getContentPane().add(new JLabel(" Minimize this Window!"));
myThreadFrame.setSize(150, 60);
myThreadFrame.setVisible(true);
myThreadFrame.start();
}
}